struct _GtkCssScannerPrivate
{
GFile *file;
+ GFile *base;
GSList *state;
GSList *cur_selectors;
GHashTable *cur_properties;
priv = scanner->user_data = g_slice_new0 (GtkCssScannerPrivate);
if (file)
- priv->file = g_object_ref (file);
+ {
+ priv->file = g_object_ref (file);
+ priv->base = g_file_get_parent (file);
+ }
+ else
+ {
+ char *dir = g_get_current_dir ();
+ priv->base = g_file_new_for_path (dir);
+ g_free (dir);
+ }
priv->cur_properties = g_hash_table_new_full (g_str_hash,
g_str_equal,
return scanner;
}
+static GFile *
+gtk_css_scanner_get_base_url (GScanner *scanner)
+{
+ GtkCssScannerPrivate *priv = scanner->user_data;
+
+ return priv->base;
+}
+
static void
gtk_css_provider_init (GtkCssProvider *css_provider)
{
{
gboolean loaded;
gchar *path = NULL;
- GFile *base, *actual;
- char *dirname;
+ GFile *actual;
GError *error = NULL;
gtk_css_scanner_push_scope (scanner, SCOPE_VALUE);
return G_TOKEN_IDENTIFIER;
}
- if (scanner->input_name)
- dirname = g_path_get_dirname (scanner->input_name);
- else
- dirname = g_get_current_dir ();
-
- base = g_file_new_for_path (dirname);
- g_free (dirname);
-
- actual = _gtk_css_parse_url (base, path, NULL, &error);
- g_object_unref (base);
+ actual = _gtk_css_parse_url (gtk_css_scanner_get_base_url (scanner),
+ path,
+ NULL,
+ &error);
if (actual == NULL)
{
else
{
GError *error = NULL;
- GFile *base;
- char *dirname;
- gboolean success;
-
- if (scanner->input_name)
- dirname = g_path_get_dirname (scanner->input_name);
- else
- dirname = g_get_current_dir ();
-
- base = g_file_new_for_path (dirname);
- g_free (dirname);
-
- success = _gtk_css_value_from_string (val,
- base,
- value_str,
- &error);
-
- g_object_unref (base);
-
- if (success)
+
+ if (_gtk_css_value_from_string (val,
+ gtk_css_scanner_get_base_url (scanner),
+ value_str,
+ &error))
{
g_hash_table_insert (priv->cur_properties, prop, val);
}